package servlet;

import com.fasterxml.jackson.databind.ObjectMapper;
import common.AppConfig;
import common.AppResult;
import dao.BlogDao;
import model.Blog;
import model.User;
import utills.StringUtils;
import utills.UserUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author quan
 * @Description 功能3：获取当前所有的博客列表
 * @Date 2023/7/4 20:14
 */

@WebServlet("/blog")
public class BlogServlet extends HttpServlet {
    //用户数据库访问的Dao
    private BlogDao blogDao = new BlogDao();
    //用于转换Json
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=utf-8");
        //2、前提：要获取所有的博客的前提是：要保证用户已经登录
        //校验用户的登录状态
        if(UserUtils.checkUserLoginStatus(req) == null){
            //设置HTTP状态码:403表示没有权限访问，在前端的时候会调用到error方法
            resp.setStatus(403);
            //返回错误信息
            resp.getWriter().write(objectMapper.writeValueAsString(AppResult.failed("用户没有登录，请登录后再试！")));
            //中断代码流程
            return;
        }
        //-------------功能4实现：在原先基础上实现：如果传入blogId参数，就返回对应的博客信息，否则返回所有的博客列表信息
        //获取blogId参数
        String blogId = req.getParameter("blog_Id");
        //定义返回的Json变量
        String jsonStr = null;
        //判断参数是否为空:如果是空的话，就查询所有的博客列表
        if(StringUtils.isEmpty(blogId)){
            //3、获取所有的博客（是个集合）并返回
            List<Blog> blogs = blogDao.selectAll();
            //在这里处理一下：如果集合为空的话，就返回一个空集合[]，而不是null的形式
            if(blogs == null){
                blogs = new ArrayList<Blog>();
            }
            //序列化
            jsonStr = objectMapper.writeValueAsString(AppResult.success(blogs));
        }else{
            //否则根据传入的blogId查询对应的博客信息
            Blog blog = blogDao.selectById(Long.valueOf(blogId));
            //序列化成字符串
            jsonStr = objectMapper.writeValueAsString(AppResult.success(blog));
        }
        //正常返回给前端
        resp.getWriter().write(jsonStr);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置编码集
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset=utf-8");
        //获取当前用户的登录信息：从session中获取
        User user = UserUtils.checkUserLoginStatus(req);
        //登录用户的校验：没有登录的用户是不能写博客的
        if(user == null){
            //设置HTTP状态码，用于前端处理不同的响应方法
            resp.setStatus(403);
            //返回错误信息
            String jsonStr = objectMapper.writeValueAsString(AppResult.failed("无权访问，请先登录！"));
            resp.getWriter().write(jsonStr);
            return;
        }
        //说明用户已经登录
        //（1）接收用户提供的参数
        String title = req.getParameter("title");
        String content = req.getParameter("content");
        if(StringUtils.isEmpty(title) || StringUtils.isEmpty(content)){
            String jsonStr = objectMapper.writeValueAsString(AppResult.failed("标题或者正文不能为空"));
            resp.getWriter().write(jsonStr);
        }
        //（2）创建blog对象，传入blogDao中的insert方法
        Blog blog = new Blog();
        blog.setTitle(title);
        blog.setContent(content);
        blog.setCreateTime(new Timestamp(System.currentTimeMillis()));
        //当前登录用户是谁，写博客的作者就是谁
        blog.setUserId(user.getId());
        //(3)调用数据库
        int row = blogDao.insert(blog);
        //(4)判断行数
        if(row <= 0){
            //返回错误信息
            String jsonStr = objectMapper.writeValueAsString(AppResult.failed("保存文章失败，请联系管理员！"));
            resp.getWriter().write(jsonStr);
            return;
        }
        //（5）返回成功信息
        resp.getWriter().write(objectMapper.writeValueAsString(AppResult.success("文章发布成功")));
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //(1)设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json;charset = utf-8");
        //(2)获取前端控件参数
        String blogId = req.getParameter("blog_Id");
        //非空校验
        if(StringUtils.isEmpty(blogId)){
            resp.getWriter().write(objectMapper.writeValueAsString(AppResult.failed("没有找到文章编号！")));
        }
        //(3)获取当前登录的用户,session中获取
        User user = UserUtils.checkUserLoginStatus(req);
        //表明用户没有登录
        if(user == null){
            String jsonStr = objectMapper.writeValueAsString(AppResult.failed("当前用户没有登录，请登录后再试！"));
            resp.getWriter().write(jsonStr);
            //设置HTTP状态码
            resp.setStatus(403);
            //中断代码流程
            return;
        }
        //(4)判断当前登录的用户与博客作者是否相同：通过登录用户的用户Id与写博客的用户Id做比较
        //首先获取博客对象
        Blog blog = blogDao.selectById(Long.valueOf(blogId));
        //判断博客是否存在
        if(blog == null){
            resp.getWriter().write(objectMapper.writeValueAsString(AppResult.failed("文章不存在")));
        }
        //判断是否同一个作者
        if(user.getId() != blog.getUserId()){
            resp.getWriter().write(objectMapper.writeValueAsString(AppResult.failed("无权删除别人的文章！")));
            return;
        }
        //(5)否则调用Dao进行删除操作
        int row = blogDao.deleteById(Long.valueOf(blogId));
        //(6)判断结果
        if(row != 1){
            resp.getWriter().write(objectMapper.writeValueAsString(AppResult.failed("删除失败")));
            return;
        }
        //说明删除成功
        resp.getWriter().write(objectMapper.writeValueAsString(AppResult.success("删除成功")));
    }
}



